import uuid

from pydantic import BaseModel
from typing import Union
from typing import Optional


# 统一响应格式类
class ApiResponse(BaseModel):
    code: int
    result: Union[list, dict, str, None]  # data 可以是字典、字符串或者为空
    message: str


# 创建数据模型类，用于 POST 请求的请求体
class getPointsReq(BaseModel):
    lng: float
    lat: float
    points_num: int = 4
    radius_meters: int = 7


# 飞向点位请求
class flyToReq(BaseModel):
    longitude: float
    latitude: float
    height: int = 4
    speed: int = 7

    def to_dict(self):
        return {
            'longitude': self.longitude,
            'latitude': self.latitude,
            'height': self.height,
            'speed': self.speed
        }


class cloudControlAuthReq(BaseModel):
    user_callsign: str
    user_id: str

    def to_dict(self):
        return {
            'user_callsign': self.user_callsign,
            'user_id': self.user_id,
            'control_keys': ["flight"]
        }


class takeoffPointReq(BaseModel):
    # 目标点纬度(角度值)
    target_latitude: Optional[float] = None  # 范围: -90 到 90
    # 目标点经度(角度值)
    target_longitude: Optional[float] = None  # 范围: -180 到 180
    # 目标点高度（米）
    target_height: Optional[float] = None  # 范围: 2 到 1500 米
    # 安全起飞高度（米）
    security_takeoff_height: Optional[float] = None  # 范围: 20 到 1500 米
    # 返航模式设置值（0: 智能高度，1: 设定高度）
    rth_mode: Optional[int] = None  # 枚举: 0 或 1
    # 返航高度（米）
    rth_altitude: Optional[int] = None  # 范围: 2 到 1500 米
    # 遥控器失控动作（0: 悬停，1: 着陆，2: 返航）
    rc_lost_action: Optional[int] = None  # 枚举: 0、1 或 2
    # 指点飞行失控动作（0: 继续执行，1: 退出任务）
    commander_mode_lost_action: Optional[int] = None  # 枚举: 0 或 1
    # 指点飞行模式（0: 智能高度飞行，1: 设定高度飞行）
    commander_flight_mode: Optional[int] = None  # 枚举: 0 或 1
    # 指点飞行高度（米）
    commander_flight_height: Optional[float] = None  # 范围: 2 到 3000 米
    # 一键起飞任务 UUID
    flight_id: Optional[str] = str(uuid.uuid4())
    # 一键起飞的最大速度（米/秒）
    max_speed: Optional[int] = None  # 范围: 1 到 15 米/秒
    # 飞行安全预检查（0: 关闭，1: 开启）
    flight_safety_advance_check: Optional[int] = None  # 默认为 0，值为 1 时表示开启安全检查

    def to_dict(self):
        # 使用字典推导式排除掉值为 None 的字段
        return {key: value for key, value in self.model_dump(exclude_none=True).items()}


class photoReq(BaseModel):
    payload_index: str

    def to_dict(self):
        return {
            'payload_index': self.payload_index
        }


class AimReq(BaseModel):
    payload_index: str
    camera_type: str
    locked: bool
    x: float
    y: float

    def to_dict(self):
        return {
            'payload_index': self.payload_index,
            'camera_type': self.camera_type,
            'locked': self.locked,
            'x': self.x,
            'y': self.y
        }


class LookAtReq(BaseModel):
    height: float
    latitude: float
    longitude: float
    locked: bool
    payload_index: str

    def to_dict(self):
        return {
            'height': self.height,
            'latitude': self.latitude,
            'longitude': self.longitude,
            'locked': self.locked,
            'payload_index': self.payload_index
        }


class DrcModeEnterReq(BaseModel):
    hsi_frequency: int  # HSI频率
    osd_frequency: int  # OSD频率
    address: str  # Broker地址
    client_id: str  # 客户端ID
    enable_tls: bool  # 是否启用TLS
    expire_time: Optional[int] = 0  # 过期时间（UNIX时间戳）
    password: str  # 密码
    username: str  # 用户名

    def to_dict(self):
        return {
            'hsi_frequency': self.hsi_frequency,
            'osd_frequency': self.osd_frequency,
            'mqtt_broker': {
                'address': self.address,
                'client_id': self.client_id,
                'enable_tls': self.enable_tls,
                'expire_time': self.expire_time,
                'password': self.password,
                'username': self.username
            }
        }

class flyPointsReq(BaseModel):
    points: list
    speed: int = 7

class flyPointsLookReq(BaseModel):
    points: list
    lookPointReq: LookAtReq
